
import java.awt.Component;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Main extends JFrame implements ActionListener{
	//cele 3 variabile determina cei 3 parametrii ai ferestrei.
	// Cele 2 casete text(parametru si rezultat) si butonul
	// la a carui apasare se face calculul
	JButton submit;
	JTextField parametru;
	JTextField rezultat;
	
	public void creareMediuGrafic(){
		
		// 'fereastra' este containerul in care vor fi asezate
		// butoanele si casutele text
		JFrame fereastra=new JFrame();
		fereastra.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fereastra.setAlwaysOnTop(true);
		Container suprafata=fereastra.getContentPane();
		suprafata.setLayout(new BoxLayout(suprafata,BoxLayout.Y_AXIS));
		//obiectele se aseaza pe rand in zona de reprezentare
		// a ferestrei obtinuta cu getContentPane()
		JLabel info=new JLabel("Introduceti numarul in cifre romane:");
		info.setAlignmentX(Component.CENTER_ALIGNMENT);
		suprafata.add(info);
		parametru=new JTextField(12);
		parametru.setAlignmentX(Component.CENTER_ALIGNMENT);
		suprafata.add(parametru);
		submit=new JButton("Calculeaza");
		submit.setAlignmentX(Component.CENTER_ALIGNMENT);
		suprafata.add(submit);
		submit.addActionListener(this);
		rezultat=new JTextField(12);
		rezultat.setAlignmentX(Component.CENTER_ALIGNMENT);
		suprafata.add(rezultat);
		rezultat.setEditable(false);
		// se incarca elementele in fereastra, functia pack
		//si se face fereastra vizibila
		fereastra.pack();
		fereastra.setVisible(true);
	}
	
	
	// functia care 'asculta' la apasarea butonului
	public void actionPerformed(ActionEvent event) {
		
		if (event.getSource().equals(submit)){
		rezultat.setText(calculat(parametru.getText()));
		}
	}
	
	
	
	// functia in care se face trimiterea spre functiile
	// de interpretare din diferitele clase de interpretare
	public String calculat(String sirPars){
		
		// de tip context este rezultatul care va fi dat
		// ca parametru diferitelor functii
		// interpretor pentru a fi modificat
		Context rezultat = new Context();
		sirPars = sirPars.toUpperCase();
		char[] lista = sirPars.toCharArray();
		for (char c : lista) {
		// ExpresieAbstracta este clasa abstracta care tine
		// antetul functiei interpretor
		ExpresieAbstracta expr=new ExpresieNula();
		switch (c) {
		case 'I':
		expr = new Unu();
		break;
		case 'V':
		expr = new Cinci();
		break;
		case 'X':
		expr = new Zece();
		break;
		case 'L':
		expr = new CinciZeci();
		break;
		case 'C':
		expr = new Suta();
		break;
		case 'D':
		expr = new CinciSute();
		break;
		case 'M':
		expr = new Mie();
		break;
		}
		expr.interpret(rezultat);
		}
		return String.valueOf(rezultat.returneazaFinal());
	}

// functia principala care lanseaza modulul grafic
	public static void main(String[]args){
		Main p=new Main();
		p.creareMediuGrafic();
	}
}
